package 面试;

import java.util.Arrays;

/**
 * 荷兰国旗包含三种颜色：红、白、蓝。
 *
 * 有三种颜色的球，算法的目标是将这三种球按颜色顺序正确地排列。
 *
 * 它其实是三向切分快速排序的一种变种，在三向切分快速排序中，
 * 每次切分都将数组分成三个区间：小于切分元素、等于切分元素、大于切分元素，
 *
 * 而该算法是将数组分成三个区间：等于红色、等于白色、等于蓝色。
 */
public class 荷兰国旗问题 {

    /**
     * Input: [2,0,2,1,1,0]
     * Output: [0,0,1,1,2,2]
     *
     * 其实该问题并不是说对数据排序就算了。
     * 真正的思想是：将0都放在最前面，1放在中间，2放在最后
     */
    public static void sortColors(int[] nums) {
        int first = -1;
        int search = 0;
        int last = nums.length;
        while (search < last) {
            // 0 应该放到前面
            if (nums[search] == 0) {
                swap(nums, ++first, search++);// search 需要++，因为已经将当前的 0 放到前面去了，需要检索后面的数据
            } else if (nums[search] == 2) {
                swap(nums, --last, search);
                // search 不需要++，因为当前交换的是 2 ，
                // 把 2 交换到后面去了之后可能又携带一个 2 回来，也就是说等于没换。
                // 为了防止这类情况发生，需要稳住 search 的位置，直到没有发生交换事件或者 search 往前交换
            } else {
                search++;
            }
        }
    }

    private static void swap(int[] nums, int i, int j) {
        int t = nums[i];
        nums[i] = nums[j];
        nums[j] = t;
    }

    public static void main(String[] args) {
        int[] nums = {2,0,2,1,1,0};
        sortColors(nums);
        System.out.println(Arrays.toString(nums));
    }
}
